#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

enum Direction{
    UP=0, DOWN, LEFT, RIGHT,CLICK
};

int Get_CLICK()
{
    //打开触摸屏文件
    int fd_ts = open("/dev/input/event0", O_RDWR);
    if (fd_ts < 0)
    {
        perror("open /dev/input/event0 fail");
        exit(1);
    }
    
    //读触摸屏文件(不是写)
    //定义一个存储触摸屏信息的结构体，系统自带的(/usr/include/linux/input.h)
    /*
    struct input_event 
    {
    struct timeval time;  // 事件发生的时间戳
    __u16 type;           // 事件类型（如键盘、鼠标、触摸等）
    __u16 code;           // 事件代码（如具体的按键码、坐标轴等）
    __s32 value;          // 事件值（如按键按下/松开、坐标值、压力值等）
    };
    */

    struct input_event ts;

    //每一次点击都会触发六次事件，每次返回的值代表着不同的信息
    #if 0
    while(1)
    {
        memset(&ts, 0, sizeof(struct input_event));
        int ret = read(fd_ts, &ts, sizeof(struct input_event));
        printf("ts.type = %d\n", ts.type);
        printf("ts.code = %d\n", ts.code);
        printf("ts.value = %d\n", ts.value);
        
    }
    #endif 

    //只获取X轴和Y轴的变量(触摸屏1024 * 600  lcd屏800 * 480)
    #if 1
    while(1)
    {
        memset(&ts, 0, sizeof(struct input_event));
        int ret = read(fd_ts, &ts, sizeof(struct input_event));
        //获取点击时X轴的坐标
        //EV_ABS == 3, ABS_X = 0 ABS_Y = 1
        if(ts.type == EV_ABS && ts.code == ABS_X)
            printf("X = %d ", (int)(ts.value*800/1024));
        //获取点击时Y轴的坐标
        if(ts.type ==EV_ABS && ts.code == ABS_Y)
            printf("Y = %d\n", (int)(ts.value*480/600));

    }
    #endif
}


int Get_Slide_or_CLICK(int *x, int *y)
{

    #if 1
    //触摸屏滑动
        //打开触摸屏文件
        int fd_ts = open("/dev/input/event0", O_RDWR);
        if (fd_ts < 0)
        {
            perror("open /dev/input/event0 fail");
            exit(1);
        }
        struct input_event ts;

    while(1)
    {   
        
        int x1=0,y1=0;
        //抓取按下值
        while(1)
        {   
            memset(&ts, 0, sizeof(struct input_event));
            read(fd_ts, &ts, sizeof(struct input_event));
            //按下时，计算X的坐标
            if(ts.type == EV_ABS && ts.code == ABS_X)
            {
                *x = ts.value * 800 / 1024;
            }

            //按下时，计算Y坐标
            if(ts.type == EV_ABS && ts.code == ABS_Y)
            {
                *y = ts.value * 480 / 600;
            }

            //按下时的坐标
            if(ts.type == EV_KEY && ts.value == 1 && ts.code == BTN_TOUCH)
            {
                printf("X=%d  Y=%d \n", *x, *y);
                break;
            }

        }


        //抓取松开值
        while(1)
        {   
            memset(&ts, 0, sizeof(struct input_event));
            read(fd_ts, &ts, sizeof(struct input_event));
            //松开时，计算X的坐标
            if(ts.type == EV_ABS && ts.code == ABS_X)
            {
                x1 = ts.value * 800 / 1024;
            }

            //松开时，计算Y坐标
            if(ts.type == EV_ABS && ts.code == ABS_Y)
            {
                y1 = ts.value * 480 / 600;
            }

            //松开时的坐标
            if(ts.type == EV_KEY && ts.value == 0 && ts.code == BTN_TOUCH)
            {
                printf("X1=%d  Y1=%d \n", x1, y1);
                break;
            }

        }

        //判断左右
        //可以给x与x1,y与y1做差，排除误触的可能
        if(x1 == 0) printf("CLICK111\n");    
        else if(*x > x1 && *y == y1) printf("正左划\n");
        else if(*x > x1 && *y > y1) printf("左上划\n");
        else if(*x > x1 && *y < y1) printf("左下划\n");
        else if(*x < x1 && *y == y1) printf("正右划\n");
        else if(*x < x1 && *y > y1) printf("右上划\n");
        else  printf("右下划\n");
        
    }
    #endif


}



int main(int argc, char **argv)
{
    int x=0, y=0;
    while(1)
    {
        Get_Slide_or_CLICK(&x, &y);
    }
    return 0;
}